package com.fengwk.cv4j.compute;

/**
 * 运算
 * 
 * @author fengwk
 *
 * @param <T>
 */
public interface Compute<T> {

	/**
	 * t1+t2
	 * 
	 * @param t1
	 * @param t2
	 * @return
	 */
	T add(T t1, T t2);
	
	/**
	 * t1-t2
	 * 
	 * @param t1
	 * @param t2
	 * @return
	 */
	T sub(T t1, T t2);
	
	/**
	 * t1*t2
	 * 
	 * @param t1
	 * @param t2
	 * @return
	 */
	T mul(T t1, T t2);
	
	/**
	 * t1/t2
	 * 
	 * @param t1
	 * @param t2
	 * @return
	 */
	T div(T t1, T t2);
	
	/**
	 * t1^t2
	 * 
	 * @param t1
	 * @param t2
	 * @return
	 */
	T pow(T t1, T t2);
	
	/**
	 * exp(t)
	 * 
	 * @param t
	 * @return
	 */
	T exp(T t);
	
	/**
	 * log(t)
	 * 
	 * @param t
	 * @return
	 */
	T log(T t);
	
	/**
	 * -t
	 * 
	 * @param t
	 * @return
	 */
	T neg(T t);
	
	/**
	 * 求均值
	 * 
	 * @param ts
	 * @return
	 */
	T mean(@SuppressWarnings("unchecked") T...ts);
	
	/**
	 * 求和
	 * 
	 * @param ts
	 * @return
	 */
	T sum(@SuppressWarnings("unchecked") T...ts);
	
	/**
	 * 取模
	 * 
	 * @param t1
	 * @param t2
	 * @return
	 */
	T mod(T t1, T t2);
	
	/**
	 * 求绝对值
	 * 
	 * @param t
	 * @return
	 */
	T abs(T t);
	
	/**
	 * 取符号位
	 * 
	 * @param t
	 * @return
	 */
	T sign(T t);
	
	/**
	 * 最大值
	 * 
	 * @param t
	 * @return
	 */
	T max(@SuppressWarnings("unchecked") T...ts);
	
	/**
	 * 最小值
	 * 
	 * @param t
	 * @return
	 */
	T min(@SuppressWarnings("unchecked") T...ts);
	
	/**
	 * 三角函数cosine
	 * 
	 * @param t
	 * @return
	 */
	T cos(T t);
	
	/**
	 * 三角函数sine
	 * 
	 * @param t
	 * @return
	 */
	T sin(T t);
	
	/**
	 * 三角函数tan
	 * 
	 * @param t
	 * @return
	 */
	T tan(T t);
	
	/**
	 * 三角函数atan
	 * 
	 * @param t
	 * @return
	 */
	T atan(T t);
	
	/**
	 * 四舍五入
	 * 
	 * @param t
	 * @return
	 */
	T round(T t);
	
	/**
	 * 向下取整
	 * 
	 * @param t
	 * @return
	 */
	T floor(T t);
	
	/**
	 * 向上取整
	 * 
	 * @param t
	 * @return
	 */
	T ceil(T t);
	
	/**
	 * 相等运算</br>
	 * 
	 * @param t
	 * @return 相等返回1数值的映射,不等返回0数值的映射
	 */
	T equals(T t1, T t2);
	
}
